package org.Yiran.timetale_re.datagen;

import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.ItemTagsProvider;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.common.data.ExistingFileHelper;
import org.Yiran.timetale_re.Timetale_re;
import org.Yiran.timetale_re.item.MaterialRegister;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.CompletableFuture;

/**
 * 物品标签提供器类
 * <p>
 * 该类负责为模组中的物品生成数据包标签，以便其他模组或游戏机制可以引用这些物品组。
 * 主要功能包括为各种材料生成标准的Forge标签，如ingots、nuggets、storage_blocks等。
 * </p>
 */
public class ModItemTagsProvider extends ItemTagsProvider {
    
    // ============================== 构造方法 ==============================
    
    /**
     * 构造一个新的物品标签提供器
     * 
     * @param output 数据包输出位置
     * @param lookupProvider 注册表查找提供器
     * @param existingFileHelper 现有文件助手，用于验证标签文件是否存在
     */
    public ModItemTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider,
                              ExistingFileHelper existingFileHelper) {
        super(output, lookupProvider, CompletableFuture.completedFuture(null), Timetale_re.MODID, existingFileHelper);
    }

    // ============================== 标签添加方法 ==============================
    
    /**
     * 添加所有物品标签
     * <p>
     * 为所有已注册的材料生成标准Forge标签，包括：
     * - 锭标签 (forge:ingots/material)
     * - 粒标签 (forge:nuggets/material)
     * - 存储块标签 (forge:storage_blocks/material)
     * - 粉末标签 (forge:dusts/material)
     * - 粗矿标签 (forge:raw_materials/material)
     * - 矿物标签 (forge:ores/material)
     * - 粗矿块标签 (forge:storage_blocks/raw_material)
     * </p>
     * 
     * @param provider 注册表提供器
     */
    @Override
    protected void addTags(HolderLookup.@NotNull Provider provider) {
        System.out.println("开始为所有材料生成物品标签...");
        int materialCount = MaterialRegister.getRegisteredMaterials().size();
        System.out.println("共有 " + materialCount + " 种材料需要生成标签");
        int totalTagCount = 0;
        
        // 为所有材料生成通用标签
        for (MaterialRegister.MaterialDefinition material : MaterialRegister.getRegisteredMaterials()) {
            System.out.println("正在为材料 \"" + material.getName() + "\" 生成标签...");
            int materialTagCount = 0;
            
            // 为锭生成 forge:ingots/<material> 标签
            if (material.getIngot() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "ingots/" + material.getName())))
                        .add(material.getIngot().get());
                System.out.println("  已添加锭标签: forge:ingots/" + material.getName());
                materialTagCount++;
            }

            // 为粒生成 forge:nuggets/<material> 标签
            if (material.getNugget() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "nuggets/" + material.getName())))
                        .add(material.getNugget().get());
                System.out.println("  已添加粒标签: forge:nuggets/" + material.getName());
                materialTagCount++;
            }

            // 为块生成 forge:storage_blocks/<material> 标签
            if (material.getBlockItem() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "storage_blocks/" + material.getName())))
                        .add(material.getBlockItem().get());
                System.out.println("  已添加存储块标签: forge:storage_blocks/" + material.getName());
                materialTagCount++;
            }

            // 为粉末生成 forge:dusts/<material> 标签
            if (material.hasDust() && material.getDust() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "dusts/" + material.getName())))
                        .add(material.getDust().get());
                System.out.println("  已添加粉末标签: forge:dusts/" + material.getName());
                materialTagCount++;
            }

            // 为粗矿生成 forge:raw_materials/<material> 标签
            if (material.getRaw() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "raw_materials/" + material.getName())))
                        .add(material.getRaw().get());
                System.out.println("  已添加粗矿标签: forge:raw_materials/" + material.getName());
                materialTagCount++;
            }

            // 为矿物方块生成 forge:ores/<material> 标签
            if (material.hasOre()) {
                // 普通矿物
                if (material.getOreItem() != null) {
                    tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "ores/" + material.getName())))
                            .add(material.getOreItem().get());
                    System.out.println("  已添加矿物标签: forge:ores/" + material.getName());
                    materialTagCount++;
                }

                // 深板岩矿物
                if (material.getDeepslateOreItem() != null) {
                    tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "ores/" + material.getName())))
                            .add(material.getDeepslateOreItem().get());
                    System.out.println("  已添加深板岩矿物标签: forge:ores/" + material.getName());
                    materialTagCount++;
                }
            }

            // 为粗矿块生成 forge:storage_blocks/raw_<material> 标签
            if (material.hasRawBlock() && material.getRawBlockItem() != null) {
                tag(net.minecraft.tags.ItemTags.create(ResourceLocation.fromNamespaceAndPath("forge", "storage_blocks/raw_" + material.getName())))
                        .add(material.getRawBlockItem().get());
                System.out.println("  已添加粗矿块标签: forge:storage_blocks/raw_" + material.getName());
                materialTagCount++;
            }
            
            System.out.println("材料 \"" + material.getName() + "\" 共生成了 " + materialTagCount + " 个标签");
            totalTagCount += materialTagCount;
        }
        
        System.out.println("标签生成完成! 总共为 " + materialCount + " 种材料生成了 " + totalTagCount + " 个标签");
    }
}